package rn;

import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import fabricas.DAOFabrica;
import interfaces.InterfaceAnexoProcessoDAO;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import util.FacesUtil;
import entidades.AnexoProcesso;
import entidades.LogEventos;
import entidades.Setor;
import entidades.TramitacaoAnexo;

/**
 *
 * @author Marcelo Neto
 */
public class AnexoProcessoRN 
{
    private InterfaceAnexoProcessoDAO interfaceAnexoProcessoDAO;

    public AnexoProcessoRN() {
        this.interfaceAnexoProcessoDAO = DAOFabrica.criarAnexoProcessoDAO();
    }

    public AnexoProcesso carregarAnexo(Integer id) throws Exception {
        return this.interfaceAnexoProcessoDAO.carregarAnexo(id);
    }
    
    public void incluirAnexo(AnexoProcesso anexoProcesso, Usuario usuario) throws DAOException, Exception
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer anexo = anexoProcesso.getAnexo();
        Integer idusu = usuario.getIdusuario();
        Integer idUnidadeUsu = usuario.getPessoa().getUnidade();
        Integer idSetorUsu = usuario.getPessoa().getSetor();
        String postNome = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        
        //Obtem a descrição da OM e do Setor
        UnidadeMilitarRN umRN = new UnidadeMilitarRN();
        UnidadeMilitar um = umRN.carregarUnidadeMilitar(idUnidadeUsu);
        String omSigla = um.getSiglaOM();
        
        SetorRN stRN = new SetorRN();
        Setor st = stRN.carregarSetor(idSetorUsu);
        String stSigla = st.getSiglaSetor();
        
        //Seta definições na tabela anexoProcesso
        anexoProcesso.setCadastradoPor(postNome);
        anexoProcesso.setDataCadastramento(dataAtual);
        anexoProcesso.setUnidadeAtual(idUnidadeUsu);
        anexoProcesso.setSetorAtual(idSetorUsu); 
        anexoProcesso.setDataEntradaSetor(dataAtual);
        anexoProcesso.setEncaminhadoPor(postNome);
        
        //Seta os registros da tabela TRAMITACAO
        TramitacaoAnexo tramitacaoAnexo = new TramitacaoAnexo();  
        Set<TramitacaoAnexo> tramita = new HashSet<>();
        tramitacaoAnexo.setDataTramitacao(dataAtual);
        tramitacaoAnexo.setRemetente(postNome);
        tramitacaoAnexo.setUnidadeRemetente(omSigla);
        tramitacaoAnexo.setSetorRemetente(stSigla); //No cadastro do PAG, pega o setor de usuário que cadastrou o pag.
        tramitacaoAnexo.setUnidadeDestino(omSigla);
        tramitacaoAnexo.setSetorDestino(stSigla);
        tramitacaoAnexo.setDespacho("Abertura do anexo "+anexo+".");
        tramita.add(tramitacaoAnexo);
        tramitacaoAnexo.setAnexoProcesso(anexoProcesso);
        anexoProcesso.setTramitacaoAnexo(tramita);

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);
        
        this.interfaceAnexoProcessoDAO.incluirAnexo(anexoProcesso);
        logEventos.setDescricao("o usuário "+postNome+" ("+omSigla+") cadastrou o anexo "+anexoProcesso.getAnexo()+" no processo nº "+anexoProcesso.getProcesso().getPag()+".");
        logEventosRN.salvarEvento(logEventos);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado com sucesso!", ""));
    }
    
    public void excluirAnexo(AnexoProcesso anexoProcesso, Usuario usuario) throws Exception 
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer idusu = usuario.getIdusuario();
        Integer idUnidadeUsu = usuario.getPessoa().getUnidade();
        Integer anexo = anexoProcesso.getAnexo();
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        String pag = anexoProcesso.getProcesso().getPag();

        //Obtem a sigla da OM
        UnidadeMilitarRN unidadeMilitarRN = new UnidadeMilitarRN();
        UnidadeMilitar unidade = unidadeMilitarRN.carregarUnidadeMilitar(idUnidadeUsu);
        String siglaOM = unidade.getSiglaOM();
        
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);

        Integer status = anexoProcesso.getProcesso().getStatus();
        if (status == 1) 
        {
            this.interfaceAnexoProcessoDAO.excluirAnexo(anexoProcesso);
            logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") excluiu o anexo "+anexo+" do processo nº "+pag+".");
            logEventosRN.salvarEvento(logEventos);
            //FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Volume excluído com sucesso!", ""));
        }
        else {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "O anexo "+anexo+" do processo nº "+pag+" não pode ser excluído! O processo está arquivado.", ""));
        }
    }
    
    public List<AnexoProcesso> listarAnexo() {
        return this.interfaceAnexoProcessoDAO.listarAnexo();
    }
    
    public List<AnexoProcesso> listarAnexosPorProcesso(int idprocesso, int idanexo) {
        return this.interfaceAnexoProcessoDAO.listarAnexosPorProcesso(idprocesso, idanexo);
    }
    
    public List<AnexoProcesso> listarAnexosPorProcesso(int idprocesso) {
        return this.interfaceAnexoProcessoDAO.listarAnexosPorProcesso(idprocesso);
    }
    
    public AnexoProcesso carregarAnexoPorProcesso(int idprocesso, int idanexo) {
        return this.interfaceAnexoProcessoDAO.carregarAnexoPorProcesso(idprocesso, idanexo);
    }
    
    public List<AnexoProcesso> listarAnexosNoSetor(int unidadeAtual, int setorAtual) {
        return this.interfaceAnexoProcessoDAO.listarAnexosNoSetor(unidadeAtual, setorAtual);
    }
    
    public Object totalAnexosNoSetor(int unidadeAtual, int setorAtual) {
        return this.interfaceAnexoProcessoDAO.totalAnexosNoSetor(unidadeAtual, setorAtual);
    }

    public Object totalAnexosPorStatus(int status) {
        return this.interfaceAnexoProcessoDAO.totalAnexosPorStatus(status);
    }

    public List<AnexoProcesso> listarAnexosPorStatus(int status) {
        return this.interfaceAnexoProcessoDAO.listarAnexosPorStatus(status);
    }
    
    public List<AnexoProcesso> listarAnexosPorPeriodo(Date dataIni, Date dataFim, int status) {
        return this.interfaceAnexoProcessoDAO.listarAnexosPorPeriodo(dataIni, dataFim, status);
    }
}